package com.ittao.taoaicodemother.ai;

import com.ittao.taoaicodemother.ai.guardrail.PromptSafetyInputGuardrail;
import com.ittao.taoaicodemother.ai.model.HtmlCodeResult;
import com.ittao.taoaicodemother.ai.model.MultiFileCodeResult;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.guardrail.InputGuardrails;
import reactor.core.publisher.Flux;

public interface AiCodeGeneratorService {

    /**
     * 生成HTML代码（单次生成）
     * @param userMessage 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    HtmlCodeResult generateHtmlCode(String userMessage);


    /**
     * 生成多文件代码（单次生成）
     * @param userMessage 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    MultiFileCodeResult generateMultiFileCode(String userMessage);

    /**
     * 生成HTML代码 (流式输出)
     * @param userMessage 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    Flux<String> generateHtmlCodeStream(String userMessage);

    /**
     * 生成多文件代码 (流式输出)
     * @param userMessage 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    Flux<String> generateMultiFileCodeStream(String userMessage);

    /**
     * 普通用户生成 Vue 项目代码 (流式输出)
     * @param appId 应用 ID
     * @param userMessage 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-vue-project-system-prompt_user.txt")
    TokenStream generateVueProjectCodeStreamByUser(@MemoryId Long appId, @UserMessage String userMessage);

    /**
     * Admin/VIP用户生成 Vue 项目代码 (流式输出)
     * @param appId 应用 ID
     * @param userMessage 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-vue-project-system-prompt_vip.txt")
    TokenStream generateVueProjectCodeStreamByAdminOrVip(@MemoryId Long appId, @UserMessage String userMessage);

    /**
     * 根据用户描述生成应用名称
     * @param initPrompt 用户的初始描述
     * @return 生成的应用名称
     */
    @SystemMessage(fromResource = "prompt/codegen-app-name-system-prompt.txt")
    @InputGuardrails(PromptSafetyInputGuardrail.class)
    String generateAppName(String initPrompt);
}
